package com.hotel.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.hotel.component.IocContainer;
import com.hotel.dao.UserDao;
import com.hotel.entity.PageBean;
import com.hotel.entity.User;
import com.hotel.service.UserService;
import com.hotel.exception.EntityException;
import com.hotel.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @Author Str
 * @Date 2021/10/27 20:00
 * @Description :
 */
public class UserServiceImpl implements UserService {
    private UserDao userDao = (UserDao) IocContainer.getBean("UserDao");

    @Override
    public List<User> getUsers() throws SQLException {
        return userDao.getUsers();
    }

    @Override
    public PageBean<User> getUserList(Map<String, Object> map) throws SQLException {
        //{1}从 map 中获取 page, limit。
        Integer page = (Integer) map.get("page");
        Integer limit = (Integer) map.get("limit");
        //{2}查询结果记录偏移量
        int offset = (page - 1) * limit;
        //{3}再将它们从 map 中移除。
        map.remove("page");
        map.remove("limit");
        //{4}创建 PageBean
        PageBean<User> pBean = new PageBean<>();
//        try{
        //{5}获取搜索关键字的 SQL 片段
        String schSQL = userDao.getSearchSQL(map);
        //{6}获取当前查询到的记录数。
        int count = userDao.getUserCount(schSQL);
        //{7}获取当前查询到的记录数据。
        List<User> list = userDao.getUserList(
                schSQL, offset, limit);
        //{8}设置记录数
        pBean.setCount(count);
        //{9}设置 列表数据
        pBean.setList(list);
//        }finally{
//            //{ps}关闭连接。
//            JdbcUtils.closeConnection();
//        }
        return pBean;
    }


    @Override
    public User getUserById(String id) throws SQLException {
        return userDao.getUserById(id);
    }

    @Override
    public User doLogin(String account, String password) throws SQLException, EntityException {
        User daoUser = null;
        try {
            //{1}根据用户名查询一个用户。
            daoUser = userDao.getUserByAccount(account);
            //{2}做密码的校对, 失败抛出 Entity异常。
            String ps = daoUser.getPassword();
            if (!ps.equals(password)) {
                throw new EntityException("用户登录失败。");
            }
        } finally {
            //{3}关闭连接。
            JdbcUtils.closeConnection();
        }
        //{4}返回 dbUser 对象
        return daoUser;
    }

    @Override
    public String addUser(User user) throws SQLException {
        JSONObject jo = new JSONObject();
        jo.put("result", "failed");
        jo.put("reason", "添加用户失败");
        int ret = userDao.addUser(user);
        if (ret == 1) {
            jo.put("result", "success");
            jo.put("reason", "添加用户成功");
        }
        return jo.toJSONString();
    }

    @Override
    public String updateUser(User user) throws SQLException {
        JSONObject jo = new JSONObject();
        jo.put("result", "failed");
        jo.put("reason", "修改用户失败");
        int ret = userDao.updateUser(user);
        if (ret == 1) {
            jo.put("result", "success");
            jo.put("reason", "修改用户成功");
        }
        return jo.toJSONString();
    }

    @Override
    public void deleteUser(String id) throws SQLException, EntityException {
        //{1}获取数据库连接.
        Connection conn = JdbcUtils.getConnection();
        //{2}开启事务功能 [自动提交关闭]
        conn.setAutoCommit(false);
        try{
            int ret = userDao.deleteUser(id);
            if (ret != 1) {
                throw new EntityException("删除用户失败。");
            }
            //{4}提交事务
            conn.commit();
        }finally {
            conn.close();
        }
    }

    @Override
    public void saveUser(User user) throws SQLException, EntityException {
        //{ps}这里要同时处理两件事情 [新增 / 更新]
        //{1}获取数据库连接.
        Connection conn = JdbcUtils.getConnection();
        //{2}开启事务功能 [自动提交关闭]
        conn.setAutoCommit(false);
        try {
            //{3}如果 userID 为空 ----> 新增用户
            if (user.getId() == null) {
                //{a}查询用户是否存在
                User find = userDao.getUserByAccount(user.getAccount());
                //{b}如果用户存在, 不能新增用户
                if (find != null) {
                    throw new EntityException("用户已存在。");
                }
                //{b}创建一个 uuid [A87E....]
                String uuid = UUID.randomUUID().toString();
                //(原)"A87E-C5E6-.."  ----> (新)"A87EC5E6.."
                uuid = uuid.replace("-", "");
                //{b}设置给 user
                user.setId(uuid);
//                System.out.println("Service:::"+user);
                //{c}新增用户
                userDao.addUser(user);
            } else {    //不为空 ---> 更新用户
                userDao.updateUser(user);
            }
            //{4}提交事务
            conn.commit();
        } finally {
            conn.close();
        }
    }

}
